package com.firewolf.entities.one2one_both;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MainDriver {
	
	private EntityManagerFactory factory = null;
	private EntityManager manager = null;
	private EntityTransaction tx = null;
	
	@Before
	public void init(){
		factory = Persistence.createEntityManagerFactory("jpa");
		manager = factory.createEntityManager();
		tx = manager.getTransaction();
		tx.begin();
	}
	
	@After
	public void destory(){
		tx.commit();
		manager.close();
		factory.close();
	}
	
	/**
	 * 生成表
	 */
	@Test
	public void generateTable(){
	}
	
	/**
	 * 保存的时候，建议先保存不维护关系的一端，后保存维护关系的一端，这样可以减少发送update语句
	 */
	@Test
	public void persist(){
		Department d = new Department();
		d.setName("开发部");
		
		Manager m = new Manager();
		m.setName("张三");
		m.setDept(d);
		d.setMgr(m);
		manager.persist(m);
		manager.persist(d);
		
	}
	
	/**
	 * 查询的时候
	 * 如果先获取维护关联关系的一方，则默认会延迟加载， 可以通过设置fetch来修改
	 * 如果先获取不维护关联关系的一方，则总是会查询，使用左外连接，设置fetch为立即加载后，反而会多出一条SQL，所以不建议设置
	 */
	@Test
	public void find(){
//		Department dept = manager.find(Department.class, 1);
//		System.out.println(dept.getMgr().getClass().getName());
		
		Manager m = manager.find(Manager.class, 1);
		System.out.println(m.getDept().getClass().getName());
	}
	
}
